import random
import re

from flask import current_app, jsonify
from flask import make_response
from flask import request
from flask import session

from app.libs.yuntongxun.sms import CCP
from app import redis_store, db
from app.models import User, Area
from app.utils import constants
from app.utils.captcha.captcha import captcha
from app.utils.response_code import RET
from . import passport_blue

# 首页地区展示

@passport_blue.route('/areas')
def area():
    areas = Area.query.all()
    areas_list = []
    for area in areas:
        areas_list.append(area.to_dict())

    return jsonify(errno=RET.OK, errmsg='首页成功', data=areas_list)
# 登陆
# 登陆
# URL/api/v1.0/session
# 请求方式POST
# 支持格式JSON
# 请求参数
# 参数名 必选 类型 说明
# mobile true str 手机号
# password true str 密码
@passport_blue.route('/session', methods=['POST'])
def login():
    # 获取参数
    mobile = request.json.get('mobile')
    password = request.json.get('   password')
    # 校验
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')
    # 从数据库获取
    try:
        user = User.query.filter(User.mobile == mobile).first()
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='获取用户失败')
    if not user:
        return jsonify(errno=RET.NODATA, errmsg='用户不存在')
    if not user.check_passowrd(password):
        return jsonify(errno=RET.DATAERR, errmsg='密码错误')
    # 保存到session 用户保持登陆
    session['user_id'] = user.id

    return jsonify(errno=RET.OK, errmsg='登陆成功')


# 注册
# URL:/api/v1.0/user
# 请求方式:POST
# 支持格式:JSON
# 请求参数
# 参数名 必选 类型 说明
# mobile true str 手机号
# phonecode true str 短信验证码
# password true str 密码
# { "errno": "0",     "errmsg": "注册成功" }

@passport_blue.route('/user', methods=['POST'])
def user():
    # 1 获取参数
    mobile = request.json.get('mobile')
    phonecode = request.json.get('phonecode')
    password = request.json.get('password')
    # 2 校验参数
    if not all([mobile, phonecode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')
    # 3 通过手机号获取验证码
    try:
        mobile_code = redis_store.get('mobile_code:%s' % mobile)
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='图片验证码获取失败')
    # 4 判断验证码存在
    if not mobile_code:
        return jsonify(errno=RET.PARAMERR, errmsg='图片验证码已经过期')
    # 5 比较验证码
    if mobile_code != phonecode:
        return jsonify(errno=RET.DATAERR, errmsg='参数错误')
    try:
        redis_store.delete('mobile_code:%s' % mobile)
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='短信验证码删除失败')
    # 6 存储用户
    user = User()
    user.name = mobile
    user.mobile = mobile
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='保存用户失败')
    return jsonify(errno=RET.OK, errmsg='注册成功')
# 短信验证码
# URL:/api/v1.0/smscode/
# 请求方式:POST
# 支持格式:JSON
# 请求参数:参数名 必选 类型 说明
# mobile true str 手机号
# image_code true str 图片验证码编号
# image_code_id true str 图片验证码内容
@passport_blue.route('/smscode', methods=['POST'])
def smscode():

    # 获取参数
    mobile = request.json.get('mobile')
    image_code = request.json.get('image_code')
    image_code_id = request.json.get('image_code_id')
    # 2. 参数的为空校验
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不全')
    # 3. 校验手机的格式
    if not re.match(r'1[3-9]\d{9}',mobile):
        return jsonify(errno=RET.DATAERR, errmsg='手机号格式错误')
    # 4. 通过图片验证码编号获取,图片验证码,image_code_id全局
    try:
        old_image_code = redis_store.get('image_code:%s'% image_code_id)
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='图片验证码获取失败')
    # 5. 判断图片验证码是否过期
    if not old_image_code:
        return jsonify(errno=RET.PARAMERR, errmsg='图片验证码已经过期')
    # 6. 判断图片验证码是否正确
    if image_code != old_image_code:
        return jsonify(errno=RET.DATAERR, errmsg='参数错误')
    # 7. 删除redis中的图片验证码
    try:
        redis_store.delete('image_code:%s' % image_code_id)
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='图片验证码删除失败')
    # 8. 生成一个随机的短信验证码, 调用ccp发送短信,判断是否发送成功
    sms_code = "%06d" % random.randint(0, 999999)
    ccp = CCP()
    # 参数1mobile: 要给哪个手机号发送短信    参数2: ["验证码",有效期]  参数3: 模板编号默认就是1
    # 【云通讯】您使用的是云通讯短信模板，您的验证码是{1}，请于{2}分钟内正确输入
    result = ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)

    if result == -1:
        return jsonify(errno=RET.DATAERR,errmsg="短信发送失败")
    # 9. 将短信保存到redis中
    redis_store.set('mobile_code:%s'%mobile, sms_code, constants.SMS_CODE_REDIS_EXPIRES)
    # 10. 返回响应
    return jsonify(errno=RET.OK, errmsg="发送成功")

# 图片验证码
@passport_blue.route('/imagecode')
def imagecode():
    # 获取参数 验证码编号，上一次验证码编号
    cur = request.args.get('cur')
    pre = request.args.get('pre')
    name, text, image_data = captcha.generate_captcha()
    try:
        # 将验证码存入redis
        redis_store.set('image_code:%s'%cur, text, 300)
        if pre:
            redis_store.delete('image_code:%s'%pre)
    except Exception as e:
        current_app.logger.get(e)
        return jsonify(errno=RET.DBERR, errmsg='图片验证码存储失败')
    response = make_response(image_data)
    response.headers['Content-Type'] = 'image/png'
    return response




